
#ifndef _SESION_H_

#define _SESION_H_

#include "Simulacion.h"
#include "Visualizacion.h"
#include "Vector.h"
#include "Matriz.h"
#include "Algebra.h"
#include "Enumeraciones.h"
#include "Evaluacion.h"

#include <GL/gl.h>
#include <GL/glu.h>

class Sesion
{
public:
	//Constructor
	Sesion();

	//Propiedades
	void set_TipoSesion1(TipoSesion se){enmSesion1 = se;}
	//Traslaciones
	void set_TraslacionX(float X){xtrasl = X;}
	void set_TraslacionY(float Y){ytrasl = Y;}
	void set_TraslacionZ(float Z){ztrasl = Z;}
	//Rotaciones
	void set_RotacionX(float rX){xrot = rX;}
	void set_RotacionY(float rY){yrot = rY;}
	void set_RotacionZ(float rZ){zrot = rZ;}
	//Posicion Luz
	void setLuzPosX(float valueX){LightPos[0] = valueX;}
	void setLuzPosY(float valueY){LightPos[1] = valueY;}
	void setLuzPosZ(float valueZ){LightPos[2] = valueZ;}

	void set_NroCubos(int Nro){intNumeroCubos = Nro;}
	int get_NroCubos(){return intNumeroCubos;}

	void set_VolumenLimite(bool blnVol){blnVolLimiteCol = blnVol;}

	Visualizacion& get_Visualizacion(){return objVisualizacion;}

	//Metodos
	void InicializarSesiones();
	void DibujarSesion();
	void ActualizarSesion();
	void DrawGround();

	void IniciarEvaluacion();
	void FinalizarEvaluacion();

private:
	//Atributos
	TipoSesion enmSesion1;
	//Objetos necesarios para la simulacion
	Simulacion objSimulacion;
	Visualizacion objVisualizacion;
	Evaluacion objEvaluacion;

	Triangulo objTrianguloTemp1;  //Triangulo con la colision del instrumento 1
	Triangulo objTrianguloTemp2;  //Triangulo con la colision del instrumento 2
	
	Triangulo objTrianguloTempCubo1;
	Triangulo objTrianguloTempCubo2;

	float fValorDistanciaInicialInts1;
	float fValorDistanciaFinalInts1;
	float fDeltaDistanciaInst1;

	float fValorDistanciaInicialInts2;
	float fValorDistanciaFinalInts2;
	float fDeltaDistanciaInst2;

	vector<float> fPosXCubo;
	vector<float> fPosYCubo;
	vector<float> fPosZCubo;

	vector<float> fPosXCuboAux1;
	vector<float> fPosYCuboAux1;
	vector<float> fPosZCuboAux1;
	
	vector<float> fPosXCuboAux2;
	vector<float> fPosYCuboAux2;
	vector<float> fPosZCuboAux2;

	vector<Vector4f> vMatAmbCubo;
	vector<Vector4f> vMatDifCubo;
	vector<Vector4f> vMatSpcCubo;
	vector<float> vMatShnCubo;

	int intNumeroCubos;

	GLfloat	xrot;				// Rotacion X
	GLfloat	yrot;				// Rotacion Y
	GLfloat	zrot;				// Rotacion Z

	GLfloat xtrasl;				//Traslacion X
	GLfloat ytrasl;				//Traslacion Y
	GLfloat ztrasl;				//Traslacion Z

	float rotacion;				//TEMPORAL

	float LightPos[4];
	
	//Coordenadas del instrumento 1
	float xPolInst1, yPolInst1, zPolInst1, rxPolInts1, ryPolInts1, rzPolInts1;

	//Coordenadas del instrumento 2
	float xPolInst2, yPolInst2, zPolInst2, rxPolInts2, ryPolInts2, rzPolInts2;

	//Grados de la punta para ambos instrumentos
	int intGInst1;
	int intGInst2;

	bool blnSensadoPolhemus;
	bool blnVolLimiteCol;

	void VMatMult(GLfloat *M, GLfloat *v);
	void VisualizandoInstrumentos(float fMainX, float fMainY, float fMainZ, float fX1,
									  float fY1, float fZ1, float fX2, float fY2, float fZ2);
	void TransVisTriangCol(float fMainX, float fMainY, float fMainZ, float fX1,
									  float fY1, float fZ1, float fX2, float fY2, float fZ2);
	void DrawSphereTriang(float fMainX, float fMainY, float fMainZ, float fX1,
									  float fY1, float fZ1, float fX2, float fY2, float fZ2);
	void AuxTriangCubo(float fMainX, float fMainY, float fMainZ, float fX1,
									  float fY1, float fZ1, float fX2, float fY2, float fZ2);

	GLUquadricObj	*q;	
};


#endif